package org.algorithm.熊猫.栈.第1周;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

/**
 * @date 2022-04-09 星期六 00:00
 * 堆盘子。设想有一堆盘子，堆太高可能会倒下来。因此，在现实生活中，盘子堆到一定高度时，我们就会另外堆一堆盘子。请实现数据结构SetOfStacks，模拟这种行为。SetOfStacks应该由多个栈组成，并且在前一个栈填满时新建一个栈。此外，SetOfStacks.push()和SetOfStacks.pop()应该与普通栈的操作方法相同（也就是说，pop()返回的值，应该跟只有一个栈时的情况一样）。 进阶：实现一个popAt(int index)方法，根据指定的子栈，执行pop操作。
 * <p>
 * 当某个栈为空时，应当删除该栈。当栈中没有元素或不存在该栈时，pop，popAt应返回 -1.
 * <p>
 * 示例1:
 * <p>
 * 输入：
 * ["StackOfPlates", "push", "push", "popAt", "pop", "pop"]
 * [[1], [1], [2], [1], [], []]
 * 输出：
 * [null, null, null, 2, 1, -1]
 * 示例2:
 * <p>
 * 输入：
 * ["StackOfPlates", "push", "push", "push", "popAt", "popAt", "popAt"]
 * [[2], [1], [2], [3], [0], [0], [0]]
 * 输出：
 * [null, null, null, null, 2, 1, 3]
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/stack-of-plates-lcci
 */
public class 堆盘子 {

    @Test
    public void test() {
        StackOfPlates stack = new StackOfPlates(0);
        stack.pop();
    }

    class StackOfPlates {
        List<Stack<Integer>> plates = new ArrayList<>();
        int size;

        public StackOfPlates(int cap) {
            size = cap;
        }

        public void push(int val) {
            if (size == 0) {
                return;
            }

            if (plates.isEmpty()) {
                plates.add(new Stack<>());
            }

            if (plates.get(plates.size() - 1).size() == size) {
                plates.add(new Stack<>());
            }
            plates.get(plates.size() - 1).push(val);
        }

        public int pop() {
            return popAt(plates.size() - 1);
        }

        public int popAt(int index) {
            if (size == 0 || index < 0 || index >= plates.size()) return -1;
            int pop = plates.get(index).pop();
            if (plates.get(index).empty()) plates.remove(index);
            return pop;
        }
    }
}
